//
// Created by tcj on 2022/3/9.
//

#ifndef __SYLAR_FD_MANAGER_H__
#define __SYLAR_FD_MANAGER_H__

#include "memory"
#include "thread"
#include "iomanager.h"
#include "singleton.h"

namespace sylar{
    class FdCtx:public std::enable_shared_from_this<FdCtx>{
    public:
        typedef std::shared_ptr<FdCtx> ptr;
        FdCtx(int fd);
        ~FdCtx();

        bool init();
        bool isInit() {return m_isInit;}
        bool isSocket(){return m_isSocket;}
        bool isClose(){return m_isClosed;}
        bool close();

        void setUserNonblock(bool v) { m_userNonblock =v;}
        bool getUserNonblock() const {return m_userNonblock;}

        void setSysNonblock(bool v){m_sysNonblock =v;}
        bool getSysNonblock() const {return m_sysNonblock;}

        void setTimeout(int type,uint64_t v);
        uint64_t getTimeout(int type);

    private:
        bool m_isInit:1;
        bool m_isSocket:1;
        bool m_sysNonblock:1;
        bool m_userNonblock:1;
        bool m_isClosed:1;
        int m_fd;
        uint64_t m_recvTimeout;
        uint64_t m_sendTimeout;
        sylar::IOManager* m_iomanaser;
    };


    class FdManager{
    public:
        typedef RWMutex RWMutexType;
        FdManager();

        FdCtx::ptr  get(int fd,bool auto_create = false);
        void del(int fd);

    private:
        RWMutexType m_mutex;
        std::vector<FdCtx::ptr> m_datas;
    };

typedef Singleton<FdManager> FdMgr;

}


#endif //__SYLAR_FD_MANAGER_H__
